/**
 * 图片上传工具类
 */
import { showLoading, hideLoading, showError, showSuccess } from "./common";
import api from "@/api";

/**
 * 选择并上传图片
 * @param {Object} options 配置选项
 * @param {Number} options.count 最多可以选择的图片张数，默认1
 * @param {Array} options.sizeType 所选的图片的尺寸，默认['compressed']
 * @param {Array} options.sourceType 选择图片的来源，默认['album', 'camera']
 * @param {String} options.loadingText 上传时的加载提示文字，默认'图片上传中...'
 * @param {Boolean} options.showSuccessTip 上传成功后是否显示成功提示，默认true
 * @param {String} options.successText 上传成功的提示文字，默认'上传成功'
 * @returns {Promise<Array|String>} 上传成功的图片URL数组或单个URL
 */
export const chooseAndUploadImage = (options = {}) => {
  const {
    count = 1,
    sizeType = ["compressed"],
    sourceType = ["album", "camera"],
    loadingText = "图片上传中...",
    showSuccessTip = true,
    successText = "上传成功",
  } = options;

  return new Promise((resolve, reject) => {
    uni.chooseImage({
      count,
      sizeType,
      sourceType,
      success: async (res) => {
        try {
          showLoading(loadingText);
          const tempFilePaths = res.tempFilePaths;
          const resultUrls = [];

          for (let i = 0; i < tempFilePaths.length; i++) {
            const tempFilePath = tempFilePaths[i];
            console.log("选择的图片路径:", tempFilePath);

            // 上传图片
            const imageUrl = await uploadImage(tempFilePath);
            if (imageUrl) {
              resultUrls.push(imageUrl);
            }
          }

          if (resultUrls.length > 0) {
            if (showSuccessTip) {
              showSuccess(successText);
            }
            // 根据count判断返回数组还是单个URL
            resolve(count === 1 ? resultUrls[0] : resultUrls);
          } else {
            reject(new Error("没有成功上传的图片"));
          }
        } catch (error) {
          console.error("上传图片失败:", error);
          reject(error);
        } finally {
          hideLoading();
        }
      },
      fail: (error) => {
        console.log("选择图片失败:", error);
        // 用户取消选择不应该显示错误
        if (
          error.errMsg !== "chooseImage:fail" &&
          error.errMsg !== "chooseImage:fail User cancelled"
        ) {
          showError("选择图片失败");
        }
        reject(new Error("选择图片失败"));
      },
    });
  });
};

/**
 * 上传单张图片
 * @param {String} filePath 图片临时路径
 * @returns {Promise<String>} 上传成功的图片URL
 */
export const uploadImage = async (filePath) => {
  try {
    const uploadResult = await api.user.uploadImage(filePath);

    if (uploadResult.code === 0) {
      // 获取文件名
      const fileName = filePath.split("/").pop();

      // 尝试从不同位置获取图片URL
      let imageUrl = null;

      if (uploadResult.data) {
        if (uploadResult.data.succMap && uploadResult.data.succMap[fileName]) {
          imageUrl = uploadResult.data.succMap[fileName];
        } else if (uploadResult.data.url) {
          imageUrl = uploadResult.data.url;
        } else if (uploadResult.data.fileUrl) {
          imageUrl = uploadResult.data.fileUrl;
        } else if (typeof uploadResult.data === "string") {
          // 有时候返回的可能直接就是URL字符串
          imageUrl = uploadResult.data;
        }
      }

      // 如果还是没有找到URL，检查是否有其他可能的位置
      if (!imageUrl && uploadResult.url) {
        imageUrl = uploadResult.url;
      }

      if (!imageUrl) {
        console.error("完整的上传响应:", uploadResult);
        throw new Error("未找到上传文件的URL，请检查上传响应格式");
      }

      return imageUrl;
    } else {
      throw new Error(uploadResult.msg || "上传失败");
    }
  } catch (error) {
    console.error("上传图片失败:", error);
    showError(error.message || "上传失败，请重试");
    throw error;
  }
};

export default {
  chooseAndUploadImage,
  uploadImage,
};
